@@ -121,7 +121,7 @@ ENABLE_INSECURE_AGENTS=false |
||
| 121 | 121 |
# Enable this setting to allow second precision schedule in |
| 122 | 122 |
# SchedulerAgent. By default, the use of the "second" field is |
| 123 | 123 |
# restricted so that any value other than a single zero (which means |
| 124 |
-# "on the minute") is disallowed. |
|
| 124 |
+# "on the minute") is disallowed to prevent abuse of service. |
|
| 125 | 125 |
ENABLE_SECOND_PRECISION_SCHEDULE=false |
| 126 | 126 |
|
| 127 | 127 |
# Use Graphviz for generating diagrams instead of using Google Chart |
@@ -12,7 +12,7 @@ module Agents |
||
| 12 | 12 |
|
| 13 | 13 |
cattr_reader :second_precision_enabled |
| 14 | 14 |
|
| 15 |
- description <<-MD % { seconds: (<<-MD_SECONDS if second_precision_enabled) }
|
|
| 15 |
+ description <<-MD |
|
| 16 | 16 |
This agent periodically takes an action on target Agents according to a user-defined schedule. |
| 17 | 17 |
|
| 18 | 18 |
# Action types |
@@ -48,7 +48,13 @@ module Agents |
||
| 48 | 48 |
|
| 49 | 49 |
* `0 22 * * 1-5 Etc/GMT+2`: every day of the week when it's 22:00 in GMT+2 |
| 50 | 50 |
|
| 51 |
- %{seconds}
|
|
| 51 |
+ ## Seconds |
|
| 52 |
+ |
|
| 53 |
+ You can optionally specify seconds before the minute field. |
|
| 54 |
+ |
|
| 55 |
+ * `*/30 * * * * *`: every 30 seconds |
|
| 56 |
+ |
|
| 57 |
+ #{"Only multiples of fifteen are allowed as values for the seconds field, i.e. `*/15`, `*/30`, `15,45` etc." unless second_precision_enabled}
|
|
| 52 | 58 |
|
| 53 | 59 |
## Last day of month |
| 54 | 60 |
|
@@ -71,14 +77,6 @@ module Agents |
||
| 71 | 77 |
* `0 22 * * Sun#L1`: every last Sunday of the month, at 22:00 |
| 72 | 78 |
MD |
| 73 | 79 |
|
| 74 |
- ## Seconds |
|
| 75 |
- |
|
| 76 |
- You can optionally specify seconds before the minute field. |
|
| 77 |
- |
|
| 78 |
- * `*/30 * * * * *`: every 30 seconds |
|
| 79 |
- |
|
| 80 |
- MD_SECONDS |
|
| 81 |
- |
|
| 82 | 80 |
def default_options |
| 83 | 81 |
super.update({
|
| 84 | 82 |
'schedule' => '0 * * * *', |
@@ -97,7 +95,7 @@ module Agents |
||
| 97 | 95 |
if (spec = options['schedule']).present? |
| 98 | 96 |
begin |
| 99 | 97 |
cron = Rufus::Scheduler::CronLine.new(spec) |
| 100 |
- if !second_precision_enabled && cron.seconds != [0] |
|
| 98 |
+ unless second_precision_enabled || (cron.seconds - [0, 15, 45, 60]).empty? |
|
| 101 | 99 |
errors.add(:base, "second precision schedule is not allowed in this service") |
| 102 | 100 |
end |
| 103 | 101 |
rescue ArgumentError |
@@ -49,9 +49,18 @@ describe Agents::SchedulerAgent do |
||
| 49 | 49 |
@agent.should be_valid |
| 50 | 50 |
|
| 51 | 51 |
stub(@agent).second_precision_enabled { false }
|
| 52 |
- @agent.options['schedule'] = '*/15 * * * * *' |
|
| 52 |
+ @agent.options['schedule'] = '*/10 * * * * *' |
|
| 53 |
+ @agent.should_not be_valid |
|
| 54 |
+ |
|
| 55 |
+ @agent.options['schedule'] = '5/30 * * * * *' |
|
| 53 | 56 |
@agent.should_not be_valid |
| 54 | 57 |
|
| 58 |
+ @agent.options['schedule'] = '*/15 * * * * *' |
|
| 59 |
+ @agent.should be_valid |
|
| 60 |
+ |
|
| 61 |
+ @agent.options['schedule'] = '15,45 * * * * *' |
|
| 62 |
+ @agent.should be_valid |
|
| 63 |
+ |
|
| 55 | 64 |
@agent.options['schedule'] = '0 * * * * *' |
| 56 | 65 |
@agent.should be_valid |
| 57 | 66 |
end |